#!/usr/bin/python
#
# Copyright (C) 2008 rambla.be
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

""" This sample demonstrates how to set tags on meta resources. """

import time
import rawsc
import rawsc.service
from rawsc import rass
import rawsc.rass.service
from rawsc.rass import Tag, Meta
try:
  from xml.etree import cElementTree as ElementTree
except ImportError:
  try:
    import cElementTree as ElementTree
  except ImportError:
    from elementtree import ElementTree

# user credentials for authentication to RASS
USER = "XXX"
PWD = "XXX"
SERVER = "rass.cdn0XXX.rambla.be"

# path to a local file that may be uploaded
LOCAL_FILE = "/path/to/local/file.mp4"

# name to be given to the local file on the CDN
TGT_FILENAME = "white_noise.mp4"


try:
    # Create a Rass instance, passing it your login credentials and the base service uri
    client = rawsc.rass.service.RassService(username=USER, password=PWD, server=SERVER)
    
    # upload some files, so we can tag them
    item_entry = client.postItem(dirpath = "/tutorial8/", filename = TGT_FILENAME, local_path = LOCAL_FILE)
    print "\nCreated new item resource: %s" % item_entry.id.text
    
    # retrieve the meta resource for this item
    meta_entry = client.getMetaEntryFromPath(item_entry.path)
    print "\nRetrieved meta entry: %s" % meta_entry.id.text
    print "name: " + str(meta_entry.content.params.name.text)
    print "size: " + str(meta_entry.content.params.size.text)
    print "updated: " + str(meta_entry.content.params.updated.text)
    print "mimetype: " + str(meta_entry.content.params.mimetype.text)
    
    # set tags on the meta entry
    meta_entry.content.params.tag = [Tag("eagle"), Tag("movie"),]
    meta_entry = client.updateMeta(meta_entry)
    print "\nSet tags on the meta resource: %s" % meta_entry.id.text
    print "name: " + str(meta_entry.content.params.name.text)
    print "size: " + str(meta_entry.content.params.size.text)
    print "updated: " + str(meta_entry.content.params.updated.text)
    print "mimetype: " + str(meta_entry.content.params.mimetype.text)
    for t in meta_entry.content.params.tag:
        print "tag: " + t.text
    
    # add tags to the meta item
    meta_entry.content.params.tag.append(Tag("documentary"),)
    meta_entry = client.updateMeta(meta_entry)
    print "\nAdded tag to the meta resource: %s" % meta_entry.id.text
    for t in meta_entry.content.params.tag:
        print "tag: " + t.text
    
    # reset tags on the meta item -> existing tags will be removed
    meta_entry = client.createMeta(path = meta_entry.path, tags = [Tag("birdwatching"),])
    print "\nUpdated meta entry using its path : %s" % meta_entry.path
    for t in meta_entry.content.params.tag:
        print "tag: " + t.text
    
    # # delete all manual metadata (= tags and meta elements) - doesn't delete the file (= item resource)
    # client.delete(meta_entry.id.text)
    # 
    # # delete the uploaded file
    # client.delete(item_entry.id.text)

except rawsc.service.Error, e:
    print "Error Response from server, contents = %s.\n" % str(e)
    error_dict = e[0] # error dict inside the first tuple elem
    print "status code : " + str(error_dict["status"]) + "\n"
    if error_dict.has_key("body"):
        print "error body : " + error_dict["body"] + "\n"
except rawsc.RawscException, e:
    print "RawscException caught, reason = %s.\n" % str(e)
except StandardError, e:
    print "StandardError caught, reason = %s.\n" % str(e)
except:
    print "unhandled exception caught\n"
